<?php
/**
 * Created by PhpStorm.
 * User: lhl
 * Date: 2019/6/4
 * Time: 9:52
 * Features: 数组相关方法封装
 */

namespace app\common\service;


class ArrayHelper
{
    /**
     * 二维数组，根据某个字段排序
     * @param array $array 二维数组
     * @param string $field 字段名
     * @param string $sort 升序: SORT_ASC 降序 SORT_DESC
     * @return array
     */
    public static function arrayMultisort($array,$field,$sortFlag = 'SORT_DESC'){
        $arrSort = array_column($array,$field);
        array_multisort($arrSort, constant($sortFlag), $array);
        return $array;
    }

    /**
     * 二维数组根据某个字段去重
     * @param array $arr 原数组
     * @param mixed $key 键名
     * @return array 去重后数组(重复部分返回第一条)
     */
    public static function arrayUnique($arr,$key){
        //建立一个目标数组
        $res = [];
        foreach ($arr as $value) {
            //查看有没有重复项
            if(isset($res[$value[$key]])){
                //有：销毁
                unset($value[$key]);
            }
            else{
                $res[$value[$key]] = $value;
            }
        }
        //重新索引
        $res = array_merge($res);
        return $res;
    }

    /**
     * 二维数组根据某个字段去重,获取重复的部分
     * @param  array $arr 源数组
     * @param  mixed $key 键名
     * @return array      重复部分的数组
     */
   public static function arrayUniqueRepeat($arr,$key){
        //建立一个目标数组
        $res = [];
        //重复的数组
        $repet = [];
        foreach ($arr as $value) {
            //查看有没有重复项
            if(isset($res[$value[$key]])){
                $repet[] = $value;
                //有：销毁
                unset($value[$key]);
            } else{
                $res[$value[$key]] = $value;
            }
        }
        //重新索引
        return $repet;
    }

    /**
     * 二维数组根据某个字段分组
     * @param $arr 原数组
     * @param $field 字段
     * @return array
     */
    public static function arrayGroup($arr,$field){
        $newArr = [];
        foreach($arr as $v){
            $newArr[$v[$field]][] = $v;
        }
        return array_values($newArr);
    }

    /**
     * 二维数组根据某个字段求差集
     * @param array $data   源数组
     * @param array $target 目标数组
     * @param string $filed 根据的字段名
     * @return array
     */
   public static function arrayDiff($data,$target,$field){
        $dataField = array_column($data,$field);
        $targetField = array_column($target,$field);
        $unExistField = array_diff($dataField,$targetField);
        $unExist = array();
        foreach ($data as $item){
            if(in_array($item[$field],$unExistField)){
                $unExist[] = $item;
            }
        }
        return $unExist;
    }

    /**
     * 建值对数字拼接为字符串
     * 例如 ['A'=>1,'B'=>2],$oneDelimiter=',' ,$twoDelimiter=':' 结果：A:1,B:2
     * @param array $arr 源数组
     * @param string $oneDelimiter 一级分割符
     * @param string $twoDelimiter 二级分割符
     * @return bool|string
     */
    public static function implodeArrayToStr($arr = [],$oneDelimiter = ',',$twoDelimiter = ':'){
        $return = '';
        foreach ($arr as $k => $v){
            $return .= $k . $twoDelimiter . $v . $oneDelimiter;
        }
        return substr($return,0,-1);
    }

    /**
     * 字符串分割两次得到建值对一维数组
     * 例如 'A:1,B:2',$oneDelimiter=',' ,$twoDelimiter=':' 结果：['A'=>1,'B'=>2]
     * @param string $str  需要分割的字符串
     * @param string $oneDelimiter 第一次分割的符号
     * @param string $twoDelimiter 第二次分割的符号
     * @return array
     */
   public static function explodeStrToArray($str = '',$oneDelimiter = ',',$twoDelimiter = ':'){
        $return = [];
        $arr = explode($oneDelimiter,$str);
        foreach ($arr as $k => $v){
            if (!strpos($v,$twoDelimiter)){//判断第二次分割的符号是否存在于字符串中
                $return[] = $v;
            }
            $temp = explode($twoDelimiter,$v);
            $return[$temp[0]] = $temp[1];
        }
        return $return;
    }

}